package com.sunfeng.a03;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * @Author : 孙峰
 * @Description: 实例变量初始化、实例代码块初始化 以及 构造函数初始化
 * <p>
 * 实例变量初始化与实例代码块初始化总是发生在构造函数初始化之前
 * <p>
 * Java要求在实例化类之前，必须先实例化其超类，以保证所创建实例的完整性。
 * <p>
 * 通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序
 * Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
 *
 * @Date : 2022/4/8  11:08
 */
@Slf4j
@Component
public class LifeCycleBean {

    public static Integer count;

    static {
        count = 100;
        log.debug("静态代码块！！！！");
    }


    public LifeCycleBean() {
        log.debug("LifeCycleBean 构造方法");
    }

    @Autowired
    public void autowire(@Value("${JAVA_HOME}") String home) {
        log.debug("依赖注入，{}", home);
    }

    /**
     * 初始化方法
     * PostConstruct在构造函数之后执行，init（）方法之前执行
     */
    @PostConstruct
    public void init() {
        log.debug("初始化！！");
    }

    /**
     * 销毁的方法
     */
    @PreDestroy
    public void destroy() {
        log.debug("销毁！！");
    }
}
